\documentclass[a4paper,10pt]{article}
\usepackage[spanish]{babel} %Paquetes de idioma
\usepackage[latin1]{inputenc} %Paquetes de idioma
\usepackage{graphicx} % Paquete para ingresar gráficos
\usepackage{hyperref}
\usepackage{fancybox}
\usepackage{color}
\usepackage{listings}

%Encabezado y Pié de página
\input{EncabezadoyPie.tex}
%Carátula del Trabajo
\title{ \input{Portada.tex} }

\begin{document}
	\maketitle %Hace que el título anterior sea el principal del documento
	\newpage

	\tableofcontents %Esta línea genera un indice a partir de las secciones y subsecciones creadas en el documento
	\newpage

	\section{Resumen}
		El objetivo del presente trabajo consiste en familiarizarnos con las herramientas con las cuales se trabajar\'a en el transcurso de la cursada. Las mismas son:
		\begin{itemize}
			\item Compilador GCC
			\item Shell de Unix
			\item Emulador GXEmul
			\item Sistema de Composici\'on \LaTeX{}
		\end{itemize}
		\vspace{1cm}
 	\section{Introducci\'on Te\'orica}
		\label{sec:InfoTeo}
		Para poner en pr\'actica las herramientas citadas, el presente TP consiste en realizar un programa en C que genera un \emph{volcado de
'1's y '0's} a partir de un archivo de texto cualquiera, y la operaci\'on inversa, es decir, a partir de un archivo archivo con una de caracteres '1' y '0', genera el archivo de texto correspondiente.
A continuaci\'on se explica brevemente los conceptos necesarios para llevar a cabo esta tarea:
		\vspace{0.5cm}
		\subsection{Shell de Unix}
			Un shell es un programa int\'erprete de comandos. Los comandos utilizados en el presente trabajo
			son los siguientes:
			\begin{itemize}
				\item \textbf{(\emph{pipe})}: Toma lo que se encuentra a la izquierda del pipe como la salida estandar (\emph{stdout}) por defecto y lo pasa como
					              entrada estandar (\emph{stdin}) a lo que se este a la derecha del pipe. Puede servir para pasarle a un programa un
						      archivo y que este lo reciba por la entrada estandar
				\item \textbf{echo}: Imprime un texto en (\emph{stdout}).
				\item \textbf{cat}: Con este comando se pueden ver archivos , como as\'i tambi\'en concatenar varios archivos. Al ver un archivo, el
						    mismo se escribe en la salida estandar.
			\end{itemize}
			\vspace{0.5cm}

		\subsection{Compilador GCC}
			GCC es un compilador gratuito, Open Source y multiplataforma que permite compilar c\'odigo C. 
			El mismo es un compilador estandar, es decir, que respeta la norma ISOC99 o ANSI dependiendo de su versi\'on, por lo cual se utilizan las 
			bibliotecas estandar para trabajar con el mismo. En esta asignatura el mismo es de gran utilidad dado que permite tener acceso  al c\'odigo 
			\emph{assembly} equivalente a nuestro programa en C. A continuaci\'on se detallan brevemente algunos par\'ametros que podemos darle al GCC:
			\begin{itemize}
				\item \textbf{-Wall:} Activa todos los warnings.
				\item \textbf{-o file} Almacena la salida del programa en un archivo (\emph{en este caso en file})
				\item \textbf{-O0:} Desactiva las optimizaciones
				\item \textbf{-O3:} Activa todas las optimizaciones
				\item \textbf{-g:} Genera c\'odigo agregando l\'ineas para el \emph{debbugger}
				\item \textbf{-S:} Detiene el compilador luego de generar el c\'odigo \emph{assembly}
				\item \textbf{-mrnames(solo para MIPS):} Indica al compilador que genera la salida utilizando 
									 nombre de registro en lugar de n\'umero de registro
			\end{itemize}
			Para generar c\'odigo assembly en MIPS 32 se debe ejecutar el siguiente comando desde el emulador GXemul:
			\begin{verbatim}
				gcc -Wall -O0 -S -mrnames main.c
			\end{verbatim}
			\vspace{0.5cm}

		\subsection{Emulador GXEmul}
			Es un emulador gratuito y Open Source de la arquitectuca de computadores MIPS. Tiene como ventajas que puede correr algunos sistemas operativos
			sin modificaciones (especialmente \emph{netBSD}), su portabilidad y velocidad de emulaci\'on dado que realiza la traducci\'on binaria en 
			tiempo real. 
			\vspace{0.5cm}
			
	\section{Desarrollo}
		A partir de los conceptos desarrollados en la secci\'on anterior (\ref{sec:InfoTeo}) se procedi\'o a crear un programa en C que genere un volcado de '1's y '0's y su inversa, a continuaci\'on se detalla su funcionamiento y ejecuci\'on:
		\vspace{0.5cm}
		\subsection{Modo de Operaci\'on}
			La aplicaci\'on desarrollada debe recibir una entrada (que puede ser por la entrada standard o por un archivo) y genera una salida (que puede ser a un archivo o a la salida standard). La aplicaci\'on puede ejecutarse en 2 modos, el primero es en modo \emph{binary} en el cual genera un volcado de '1's y '0's de la entrada. El segundo modo es en modo \emph{reverse} (opci\'on default) el cu\'al recibe una entrada que es un volcado de '1's y '0's v\'alido y genera el archivo binario correspondiente. A continuaci\'on se especifica los comandos que se pueden o deben ingresar para correr el programa:
			\begin{itemize}
				\item \textbf{-h --help:} Muestra el mensaje de ayuda.
				\item \textbf{-V --version:} Muestra la versi\'on del programa.
				\item \textbf{-b --binary:} Genera un volcado de '1's y '0's.	
				\item \textbf{-r --reverse:} Decodifica el volcado binario (Modo Default).
				\item \textbf{-i --input:} Ruta al archivo de entrada (default \emph{stdin})
				\item \textbf{-o --output:} Ruta al archivo de salida (default \emph{stdout})
			\end{itemize}
		\vspace{0.5cm}
		\subsection{Ejemplos}
		     \begin{verbatim}

			$ echo -n "prueba de volcado binario" | ./tp0 -r
			0111000001110010011101010110010101100010011000010010000001100100011001010010000
			0011101100110111101101100011000110110000101100100011011110010000001100010011010
			010110111001100001011100100110100101101111

			$ echo -n "ida y vuelta" | ./tp0 -r -i "-" -o "-" | ./tp0
			ida y vuelta
		     \end{verbatim}
	\section{Implementaci\'on}
	Algunas decisiones que se tomaron en la implementaci\'on fueron:
	\begin{itemize}
		\item Siempre que se ingrese el parametro de ayuda(-h o --help) o el de version (-V o --version) se ignoraran los demas parametros y se mostrara la ayuda o la version respectivamente y terminara la ejecuci\'on del programa. Por ejemplo:
		\begin{verbatim}
			$ echo -n "test" | ./tp0 -r -o "out.10" -h
		\end{verbatim}
		imprimir\'a el mensaje de ayuda solamente.
		\item Si se ingresa un comando repetido solo se tendr\'a en cuenta al \'ultimo.
		\item En caso de error de entrada, el archivo de salida resultante contendr\'a todos los caracteres transformados hasta el momento donde se
produce el error.
	\end{itemize}


\section{Compilaci\'on y Ejecuci\'on}
	\subsection{Compilaci\'on}
		Para compilar el programa se provee en el CD un archivo Makefile para compilarlo. Para esto desde una terminal en el directorio donde se encuetra el archivo Makefile se debe ejecutar el comando:
	\begin{verbatim}
		$ make
	\end{verbatim}
	Esto generara el archivo ejecutable tp0.
	\subsection{Ejecuci\'on}
		Para ejecutar el programa, una vez compilado, desde la misma terminal se ejecuta el archivo tp0 con los parametros deseados, un ejemplo de ejecuci\'on es:
	\begin{verbatim}
		$ tp0 -b tp0 -i /tmp/text -o /tmp/1s-and-0s
	\end{verbatim}
\section{Pruebas}
	A continuaci\'on se muestran algunas capturas de pantalla para distintas ejecuciones del programa.
	\begin{itemize}
		\item Imprime la version por pantalla.
			\begin{center}
				\includegraphics[width=0.8\textwidth]{tp0_version.png}
			\end{center}
			
		\item Imprime la ayuda por pantalla.
			\begin{center}
				\includegraphics[width=0.8\textwidth]{tp0_help.png}
			\end{center}
			
		\item Ejecuci\'on de volcado binario con input por stdin y output por stdout
			\begin{center}
				\includegraphics[width=0.8\textwidth]{tp0_1.png}
			\end{center}
		\item Ejecuci\'on en cadena de volcado binario con input por stdin y tomando el output por stdout de \'esta como input para convertirlo a texto nuevamente.
			\begin{center}
				\includegraphics[width=0.8\textwidth]{tp0_2.png}
			\end{center}
		\item Se crea un archivo (/tmp/input.txt) y se hace un volcado binario de \'este a el archivo /tmp/output.txt, luego se muestra la salida utilizando el comando cat y a continuci\'on se revierte a texto, obteniendo el archivo original.
			\begin{center}
				\includegraphics[width=0.8\textwidth]{tp0_3.png}
			\end{center}
	\end{itemize}
	\subsection{Pruebas Automatizadas}
		En el CD adjunto al Trabajo Pr\'actico donde se entregan los fuentes del ejecutable se proporciona un script que ejecuta test automaticos del programa. \\
		El script genera \emph{n} archivos de \emph{b} bytes a partir de /dev/urandom y genera su correspondiente volcado binario, luego realiza la decodificaci\'on de los mismos y compara los resultados con los archivos originales utilizando el comando diff.\\
		El script tiene 2 parametros:
		\begin{itemize}
			\item \textbf{-b:} Indica la cantidad de bytes que se usan del archivo /dev/urandom.
			\item \textbf{-n:} Indica la cantidad de loops de ejecuci\'on del script.
		\end{itemize} 
		Un ejemplo de ejecuci\'on del script es:
		\begin{verbatim}
			$ ./test_tp0_6620.sh -b 1024 -n 50
		\end{verbatim}
		\begin{center}
			\includegraphics[width=0.8\textwidth]{tp0_4.png}
		\end{center}
	\section{Conclusi\'on}
			En el presente trabajo resolvimos un problema piloto con el fin de familiarizarnos con una maquina MIPS corriendo una versi\'on del sistema operativo NetBSD. El problema piloto que se plante\'o fue la realizaci\'on de un programa que realice un volcado de '1's y '0's a partir de un archivo cualquiera y su inversa, es decir, a partir de un volcado de '1's y '0's regenerar el archivo original. Durante la realizaci\'on del mismo aprendimos a ejecutar la maquina virtual, a preparar la red para poder establecer un canal de comunicaci\'on entre el \emph{HostOS} y el \emph{GuestOS} y a copiar archivos de un lado a otro utilizando el comando \emph{scp}, en este caso se copio el codigo fuente del programa en lenguaje C hacia la maquina virtual para compilarlo con \emph{gcc} y obtener el codigo assembly para MIPS.	
	\newpage
	\section{Ap\'endice}
	\subsection{C\'odigo Fuente C}

\lstset{
  language=C,                     % choose the language of the code
  backgroundcolor=\color{white}, % choose the background color. You must add \usepackage{color}
  showspaces=false,               % show spaces adding particular underscores
  showstringspaces=false,         % underline spaces within strings
  showtabs=false,                 % show tabs within strings adding particular underscores
  tabsize=2,                      % sets default tabsize to 2 spaces
  captionpos=b,                   % sets the caption-position to bottom
  breaklines=true,                % sets automatic line breaking
  breakatwhitespace=true,         % sets if automatic breaks should only happen at whitespace
}

\lstinputlisting{main.c}
\newpage

\subsection{C\'odigo Fuente Assembly MIPS}
\lstset{
  backgroundcolor=\color{white}, % choose the background color. You must add \usepackage{color}
  showspaces=false,               % show spaces adding particular underscores
  showstringspaces=false,         % underline spaces within strings
  showtabs=false,                 % show tabs within strings adding particular underscores
  tabsize=2,                      % sets default tabsize to 2 spaces
  captionpos=b,                   % sets the caption-position to bottom
  breaklines=true,                % sets automatic line breaking
  breakatwhitespace=true,         % sets if automatic breaks should only happen at whitespace
}

\lstinputlisting{main.s}

\end{document}


